package cn.qf.sort;

import java.util.Arrays;
import java.util.Scanner;

public class BubbleSort {

    static void bubbleSortByDoWhile(int[] arr){
        int temp;

        boolean wrapped = false;
        int len = arr.length;
        int i = 0;
        do {
            wrapped = false;

            for(int j = 0; j < len - 1 - i; j++){ // 在每一趟循环中对数组元素进行两两比较
                // 对相邻的两个元素进行比较，符合条件交换
                if(arr[j] > arr[j+1]){
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;

                    wrapped = true;
                }
            }

            ++i;

        }while(wrapped);
    }

    // 冒泡排序方法：接收整数数组并对其进行升序排列
    static void bubbleSort(int[] arr){
        // 定义局部变量用于辅助交换数组元素
        int temp;

        int cnt = 0; // 用于记录比较的趟数
        for(int i = 0, len = arr.length; i < len; i++){ // 循环比较的趟
            ++cnt;

            boolean wrapped = false;

            for(int j = 0; j < len - 1 - i; j++){ // 在每一趟循环中对数组元素进行两两比较
                // 对相邻的两个元素进行比较，符合条件交换
                if(arr[j] > arr[j+1]){
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;

                    wrapped = true;
                }
            }

            if(!wrapped){
                break;
            }
        }

        System.out.println("比较趟数:" + cnt);
    }

    public static void main(String[] args) {
        // 创建一个整数数组，并调用 bubbleSort() 方法对其进行排序

        /*
        注：
        1、Java 中，静态方法（如 static void main()）不能直接调用非静态的方法.
           故需要把上面的 bubbleSort() 方法也用 static 进行修饰，把它变成静态方法。

        2、静态方法的调用方式有二：
        1) 使用 "类名.静态方法名(参数1, ...)"，该方式为通用方式
        2) 当 静态方法 的定义和调用在同一类中，可以直接使用 "静态方法名(参数1, ...)" 语法来调用
        */

        Scanner sc = new Scanner(System.in);

        // Step 1: 通过输入构造一个 n 长度的数组
        System.out.print("请输入数组长度：");
        int n = sc.nextInt();

        int[] nums = new int[n];

        System.out.printf("请输入 %d 个整数作为数组元素（用空格分隔）：", n);
        for (int i = 0; i < n; i++) {
            nums[i] = sc.nextInt();
        }
        System.out.println();

        // 调用 bubbleSort() 对数组进行冒泡排序
        System.out.println("排序前：" + Arrays.toString(nums));
        // BubbleSort.bubbleSort(nums);
        bubbleSort(nums);
        System.out.println("排序后：" + Arrays.toString(nums));
    }
}
